package com.yupi.springbootinit.utils;

import java.util.Calendar;

/**
 * @ClassName: com.xinmei.oc.util.LongSeqGenerator
 * @Description: 长整型序列生成器
 * @author gdw
 * @date 2017年9月12日 下午1:42:40
 */
public class LongSeqGenerator {
	/**
	 * 序列自增序列的最小值
	 */
	private static final int SEQ_MIN_INCREMENT_VALUE = 0;
	
	/**
	 * 序列自增序列的最大值
	 */
	private static final int SEQ_MAX_INCREMENT_VALUE = 999999;
	
	/**
	 * 自增序列生成器
	 */
	private static final AutoIncrementer autoIncrementer = new AutoIncrementer(SEQ_MIN_INCREMENT_VALUE, SEQ_MAX_INCREMENT_VALUE);
	
	/**
	 * @Title: generate
	 * @Description: 生成19位Long序列
	 * 			yyMMddHHmm(10位) + 机器码(3位) + 自增序列(6位)
	 * @return Long 有效的序列
	 */
	public static Long generate(){
		return getDateFragment() + getMachineFragment() + autoIncrementer.increment();
	}
	
	private static Long getDateFragment(){
		Calendar calendar = Calendar.getInstance();
		return (calendar.get(Calendar.YEAR) % 100) * YEAR_MASK 		// 两位年 
				+ (calendar.get(Calendar.MONTH) + 1) * MONTH_MASK 	// 两位月
				+ calendar.get(Calendar.DAY_OF_MONTH) * DAY_MASK	// 两位日
				+ calendar.get(Calendar.HOUR_OF_DAY) * HOUR_MASK	// 两位小时
				+ calendar.get(Calendar.MINUTE) * MINUTE_MASK;		// 两位分钟
	}
	
	private static Long getMachineFragment(){
		return 6 * MACHINE_MASK;
	}


	private static final Long YEAR_MASK = 	100_000_000_000_000_000L;
	private static final Long MONTH_MASK = 	  1_000_000_000_000_000L;
	private static final Long DAY_MASK = 	     10_000_000_000_000L;
	private static final Long HOUR_MASK = 	         100_000_000_000L;
	private static final Long MINUTE_MASK = 	       1_000_000_000L;
	private static final Long MACHINE_MASK = 	          10_000_000L;
}
